home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
helper
/
source
/
dspstr.asm
< prev
next >
Wrap
Assembly Source File
|
1991-10-18
|
14KB
|
579 lines
;*****************************
; セグメント宣言
;*****************************
pmdata segment dword public 'DATA' use32
pmdata ends
pmcode segment dword public 'CODE' use32
pmcode ends
VRAMSEL equ 104h
TBIOSEL equ 110h
FONTSEL equ 138h
ISKAN1 equ 1
ISKAN2 equ 2
;*************************************
; protect data segment defs
;*************************************
pmdata segment
;*************************************
; 16色VRAMビットパタ-ン
;*************************************
ankfnt dd 16*256 dup(?)
fntcol dd 256 dup(?)
colptn dd 000000000h,011111111h,022222222h,033333333h
dd 044444444h,055555555h,066666666h,077777777h
dd 088888888h,099999999h,0AAAAAAAAh,0BBBBBBBBh
dd 0CCCCCCCCh,0DDDDDDDDh,0EEEEEEEEh,0FFFFFFFFh
fntptn dd 000000000h,0F0000000h,00F000000h,0FF000000h
dd 000F00000h,0F0F00000h,00FF00000h,0FFF00000h
dd 0000F0000h,0F00F0000h,00F0F0000h,0FF0F0000h
dd 000FF0000h,0F0FF0000h,00FFF0000h,0FFFF0000h
dd 00000F000h,0F000F000h,00F00F000h,0FF00F000h
dd 000F0F000h,0F0F0F000h,00FF0F000h,0FFF0F000h
dd 0000FF000h,0F00FF000h,00F0FF000h,0FF0FF000h
dd 000FFF000h,0F0FFF000h,00FFFF000h,0FFFFF000h
dd 000000F00h,0F0000F00h,00F000F00h,0FF000F00h
dd 000F00F00h,0F0F00F00h,00FF00F00h,0FFF00F00h
dd 0000F0F00h,0F00F0F00h,00F0F0F00h,0FF0F0F00h
dd 000FF0F00h,0F0FF0F00h,00FFF0F00h,0FFFF0F00h
dd 00000FF00h,0F000FF00h,00F00FF00h,0FF00FF00h
dd 000F0FF00h,0F0F0FF00h,00FF0FF00h,0FFF0FF00h
dd 0000FFF00h,0F00FFF00h,00F0FFF00h,0FF0FFF00h
dd 000FFFF00h,0F0FFFF00h,00FFFFF00h,0FFFFFF00h
dd 0000000F0h,0F00000F0h,00F0000F0h,0FF0000F0h
dd 000F000F0h,0F0F000F0h,00FF000F0h,0FFF000F0h
dd 0000F00F0h,0F00F00F0h,00F0F00F0h,0FF0F00F0h
dd 000FF00F0h,0F0FF00F0h,00FFF00F0h,0FFFF00F0h
dd 00000F0F0h,0F000F0F0h,00F00F0F0h,0FF00F0F0h
dd 000F0F0F0h,0F0F0F0F0h,00FF0F0F0h,0FFF0F0F0h
dd 0000FF0F0h,0F00FF0F0h,00F0FF0F0h,0FF0FF0F0h
dd 000FFF0F0h,0F0FFF0F0h,00FFFF0F0h,0FFFFF0F0h
dd 000000FF0h,0F0000FF0h,00F000FF0h,0FF000FF0h
dd 000F00FF0h,0F0F00FF0h,00FF00FF0h,0FFF00FF0h
dd 0000F0FF0h,0F00F0FF0h,00F0F0FF0h,0FF0F0FF0h
dd 000FF0FF0h,0F0FF0FF0h,00FFF0FF0h,0FFFF0FF0h
dd 00000FFF0h,0F000FFF0h,00F00FFF0h,0FF00FFF0h
dd 000F0FFF0h,0F0F0FFF0h,00FF0FFF0h,0FFF0FFF0h
dd 0000FFFF0h,0F00FFFF0h,00F0FFFF0h,0FF0FFFF0h
dd 000FFFFF0h,0F0FFFFF0h,00FFFFFF0h,0FFFFFFF0h
dd 00000000Fh,0F000000Fh,00F00000Fh,0FF00000Fh
dd 000F0000Fh,0F0F0000Fh,00FF0000Fh,0FFF0000Fh
dd 0000F000Fh,0F00F000Fh,00F0F000Fh,0FF0F000Fh
dd 000FF000Fh,0F0FF000Fh,00FFF000Fh,0FFFF000Fh
dd 00000F00Fh,0F000F00Fh,00F00F00Fh,0FF00F00Fh
dd 000F0F00Fh,0F0F0F00Fh,00FF0F00Fh,0FFF0F00Fh
dd 0000FF00Fh,0F00FF00Fh,00F0FF00Fh,0FF0FF00Fh
dd 000FFF00Fh,0F0FFF00Fh,00FFFF00Fh,0FFFFF00Fh
dd 000000F0Fh,0F0000F0Fh,00F000F0Fh,0FF000F0Fh
dd 000F00F0Fh,0F0F00F0Fh,00FF00F0Fh,0FFF00F0Fh
dd 0000F0F0Fh,0F00F0F0Fh,00F0F0F0Fh,0FF0F0F0Fh
dd 000FF0F0Fh,0F0FF0F0Fh,00FFF0F0Fh,0FFFF0F0Fh
dd 00000FF0Fh,0F000FF0Fh,00F00FF0Fh,0FF00FF0Fh
dd 000F0FF0Fh,0F0F0FF0Fh,00FF0FF0Fh,0FFF0FF0Fh
dd 0000FFF0Fh,0F00FFF0Fh,00F0FFF0Fh,0FF0FFF0Fh
dd 000FFFF0Fh,0F0FFFF0Fh,00FFFFF0Fh,0FFFFFF0Fh
dd 0000000FFh,0F00000FFh,00F0000FFh,0FF0000FFh
dd 000F000FFh,0F0F000FFh,00FF000FFh,0FFF000FFh
dd 0000F00FFh,0F00F00FFh,00F0F00FFh,0FF0F00FFh
dd 000FF00FFh,0F0FF00FFh,00FFF00FFh,0FFFF00FFh
dd 00000F0FFh,0F000F0FFh,00F00F0FFh,0FF00F0FFh
dd 000F0F0FFh,0F0F0F0FFh,00FF0F0FFh,0FFF0F0FFh
dd 0000FF0FFh,0F00FF0FFh,00F0FF0FFh,0FF0FF0FFh
dd 000FFF0FFh,0F0FFF0FFh,00FFFF0FFh,0FFFFF0FFh
dd 000000FFFh,0F0000FFFh,00F000FFFh,0FF000FFFh
dd 000F00FFFh,0F0F00FFFh,00FF00FFFh,0FFF00FFFh
dd 0000F0FFFh,0F00F0FFFh,00F0F0FFFh,0FF0F0FFFh
dd 000FF0FFFh,0F0FF0FFFh,00FFF0FFFh,0FFFF0FFFh
dd 00000FFFFh,0F000FFFFh,00F00FFFFh,0FF00FFFFh
dd 000F0FFFFh,0F0F0FFFFh,00FF0FFFFh,0FFF0FFFFh
dd 0000FFFFFh,0F00FFFFFh,00F0FFFFFh,0FF0FFFFFh
dd 000FFFFFFh,0F0FFFFFFh,00FFFFFFFh,0FFFFFFFFh
;**********************************************
; 漢字コ-ドチェックテ-ブル
;**********************************************
public kantbl
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
kantbl db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;1
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;2
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;3
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;4
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;5
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;6
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0 ;7
db 2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ;8
db 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ;9
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;A
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;B
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;C
db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;D
db 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ;E
db 3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0 ;F
pmdata ends
;*************************************
; protect data segment defs end
;*************************************
;*************************************
; stack parametor defs
;*************************************
p_para struc
p_vadr dd ?
p_ebp dd ?
p_eip dd ?
p_str dd ?
p_page dd ?
p_x dd ?
p_y dd ?
p_chrc dd ?
p_bakc dd ?
p_fsiz dd ?
p_para ends
;*************************************
; protect code segment defs
;*************************************
pmcode segment
assume cs:pmcode,ds:pmdata
;****************************************************************************
;void wrtstr(char *str,int page,int x,int y,
; int chrcol,int bakcol,int fsiz)
;****************************************************************************
align 4 ; align set
public wrtstr
wrtstr proc near
push ebp
push eax ; vram address work
mov ebp,esp
push gs
push fs
push es
push esi
push edi
push ebx
mov ax,VRAMSEL ; VRAM Selecter
mov gs,ax ; gs = VRAM Selecter
mov ax,TBIOSEL ; TBIOS Selecter
mov fs,ax ; fs = TBIOS
mov edi,[ebp].p_y ; dsp pos Y
shl edi,9 ; Y * 512
mov eax,[ebp].p_x ; dsp pos X
shr eax,1 ; X / 2
add edi,eax ; vram address
and edi,03FFFFh ; mask 1 page
mov [ebp].p_vadr,edi ; work set
movzx eax,byte ptr [ebp].p_chrc
and al,0fh
mov eax,[eax*4+offset colptn]
mov [ebp].p_chrc,eax ; color pattn cheng
movzx eax,byte ptr [ebp].p_bakc
and al,0fh
mov eax,[eax*4+offset colptn]
mov [ebp].p_bakc,eax ; color pattn cheng
align 4 ; align set
wrtlop: ; Put Loop
mov esi,[ebp].p_str ; char *str
movzx eax,byte ptr [esi]
inc si
or al,al
jz end_wrt ; End of String ?
mov bl,[eax+offset kantbl]
and bl,ISKAN1
jz wrtank ; Not iskanji1 ?
movzx ebx,byte ptr [esi]
mov bh,[ebx+offset kantbl]
and bh,ISKAN2
jz wrtank ; Not iskanji2 ?
mov bh,al
inc si
mov [ebp].p_str,esi ; Save *str
shl bh,1 ; Shift Jis to Jis
cmp bl,080h
adc bx,1f61h
add bl,7fh
jc short wrtst1
add bl,0a2h
wrtst1: and bh,7fh ; StoJ end
mov ax,0100h ; get font egb call
mov dx,1010h ; 16 * 16
push ds
call pword ptr fs:[00a0h] ; Get Kanji Font
push ds ; ds:esi = Kanji Font
pop es ; cheng ds<->es
pop ds
mov edi,[ebp].p_vadr ; vram address
and edi,03FFFFh ; mask 1 page
or edi,[ebp].p_page ; page
mov ecx,[ebp].p_fsiz ; Y = 16 Dot Font
align 4 ; align set
wtkn1: mov bx,es:[esi]
add esi,2
cmp byte ptr [ebp].p_fsiz,16
je short wtkn2
or bx,es:[esi]
add esi,2
wtkn2:
movzx eax,bl ; Get Kanji Left Font Pattan
mov eax,[eax*4+fntptn] ; Get Vram Bit Patan
mov edx,eax
not edx
and eax,[ebp].p_chrc
and edx,[ebp].p_bakc
or eax,edx
mov gs:[edi],eax ; Write Kanji Left Font
movzx eax,bh ; Get Kanji Right Font Pattan
mov eax,[eax*4+fntptn] ; Get Vram Bit Patan
mov edx,eax
not edx
and eax,[ebp].p_chrc
and edx,[ebp].p_bakc
or eax,edx
mov gs:[edi+4],eax ; Write Kanji Right Font
add edi,512 ; 1 Line 512 Byte
and edi,03FFFFh
or edi,[ebp].p_page ; Page
loop wtkn1
add [ebp].p_vadr,8 ; 16 / 2
jmp wrtlop ; Next Put String Loop
align 4 ; align set
wrtank: ; Write Ank Font
cmp al,1Bh ; Esc Code
jne short wtak0
movzx eax,byte ptr [esi]
inc esi
wtak0: mov [ebp].p_str,esi ; Save *str
mov esi,eax
cmp byte ptr [ebp].p_fsiz,16
jne short wrtft1
shl esi,4 ; x16
add esi,3D800h ; 8x16 ANK Font Offset
jmp short wrtft2
wrtft1: shl esi,3 ; x8
add esi,3D000h ; 8x8 ANK Font Offset
wrtft2: mov ax,FONTSEL ; ANK Font Selecter
mov es,ax
mov edi,[ebp].p_vadr ; vram address
and edi,03FFFFh ; mask 1 page
or edi,[ebp].p_page ; Page
mov ecx,[ebp].p_fsiz ; Y = 16 Dot Font
align 4 ; align set
wtak1: movzx eax,byte ptr es:[esi] ; Get Font Pattan
inc esi
mov eax,[eax*4+fntptn] ; Get Vram Bit Patan
mov edx,eax
not edx
and eax,[ebp].p_chrc
and edx,[ebp].p_bakc
or eax,edx
mov gs:[edi],eax ; Write Ank Font
add edi,512 ; 1 Line 512 Byte
and edi,03FFFFh
or edi,[ebp].p_page ; Page
loop wtak1
add [ebp].p_vadr,4 ; 8 / 2
jmp wrtlop ; Next Put String Loop
end_wrt:
pop ebx
pop edi
pop esi
pop es
pop fs
pop gs
pop eax ; work dmy pop
pop ebp
ret ; end of wrtstr
wrtstr endp
;*****************************************************
;void putstr(char *str,int page,int y)
;*****************************************************
align 4 ; align set
public putstr
putstr proc near
push ebp
push eax ; vram address work
mov ebp,esp
xor eax,eax
push eax
push gs
push fs
push es
push esi
push edi
push edx
push ecx
push ebx
cld
mov ax,VRAMSEL ; VRAM Selecter
mov es,ax ; es = VRAM Selecter
mov ax,TBIOSEL ; TBIOS Selecter
mov fs,ax ; fs = TBIOS
mov ax,ds
mov gs,ax ; gs = ds
mov edi,[ebp].p_x ; dsp pos Y !!!! x == y
shl edi,9 ; Y * 512
and edi,03FFFFh ; mask 1 page
mov [ebp].p_vadr,edi ; work set
align 4 ; align set
putlop: ; Put Loop
mov esi,[ebp].p_str ; char *str
putlp2:
lodsb ; Get String ※
or al,al
je end_put ; End of String ?
movzx eax,al
mov bl,[eax+offset kantbl]
and bl,ISKAN1
jz putank ; Not iskanji1 ?
movzx ebx,byte ptr [esi]
mov bh,[ebx+offset kantbl]
and bh,ISKAN2
jz putank ; Not iskanji2 ?
mov bh,al
inc esi ; doubel_word ????? ※
mov [ebp].p_str,esi ; Save *str
shl bh,1 ; Shift Jis to Jis
cmp bl,080h
adc bx,1f61h
add bl,7fh
jc short knf1
add bl,0a2h
knf1: and bh,7fh ; StoJ end
mov ax,0100h
mov dx,1010h
call pword ptr fs:[00a0h] ; Get Kanji Font
mov edi,[ebp].p_vadr ; *vram
add edi,[ebp-4]
and edi,03FFFFh ; mask 1 page
or edi,[ebp].p_page ; or Page Offset
mov ebx,offset fntcol
xor edx,edx ; edx=0
xor ecx,ecx ; ecx=0
REPT 16
lodsw ; Get Kanji Font Pattern
mov cl,al ; Left Font Pattern
mov dl,ah ; Right Font Pattern
mov eax,gs:[ebx+ecx*4] ; Get Vram Bit Patan
stosd ; Write Left Font
mov eax,gs:[ebx+edx*4] ; Get Vram Bit Patan
stosd ; Write Right Font
add edi,512-4*2 ; 1 Line 512 Byte
ENDM
mov ax,gs
mov ds,ax
add dword ptr [ebp-4],8 ; 16 / 2 Next vram Address
jmp putlop ; Next Put String Loop
align 4 ; align set
putank: ; Write Ank Font
cmp al,1Bh ; ESC code
jne putak1
lodsb ; Get String
putak1: mov [ebp].p_str,esi ; Save *str
movzx esi,al
shl esi,6 ; 4 x 16 = 64
add esi,offset ankfnt ; ANK Font Table Offset
mov edi,[ebp].p_vadr ; *vram
add edi,[ebp-4]
and edi,03FFFFh ; mask 1 page
or edi,[ebp].p_page ; page add
mov ebx,512-4
REPT 16
movsd ; Trans Font
add edi,ebx ; Line add
ENDM
add dword ptr [ebp-4],4 ; 8 / 2 Next vram Address
jmp putlop ; Next Put String Loop
align 4
end_put:
mov ebx,320
sub ebx,[ebp-4] ; nokori dword
je nonclr
shr ebx,2 ; / 4
mov edi,[ebp].p_vadr ; *vram
add edi,[ebp-4] ; work add
and edi,03FFFFh
or edi,[ebp].p_page ; or Page Offset
mov edx,[ebp-4]
add edx,512-320
mov eax,[fntcol]
REPT 16
mov ecx,ebx ; nokori dword
rep stosd
add edi,edx
and edi,03FFFFh
or edi,[ebp].p_page
endm
nonclr:
pop ebx
pop ecx
pop edx
pop edi
pop esi
pop es
pop fs
pop gs
add esp,8 ; work pop
pop ebp
ret ; end of putstr
putstr endp
;***************************************************
;void ctblset(int chrcol,int bakcol);
;***************************************************
public ctblset
ctblset proc near
push ebp
mov ebp,esp
push esi
push edi
push fs
movzx eax,byte ptr [ebp+8]
and al,0fh
mov eax,[eax*4+offset colptn]
mov [ebp+8],eax ; color pattn cheng
movzx eax,byte ptr [ebp+12]
and al,0fh
mov eax,[eax*4+offset colptn]
mov [ebp+12],eax ; color pattn cheng
mov ecx,256 ; color bit pattn gen
mov esi,offset fntptn
mov edi,offset fntcol
ctblp: lodsd
mov edx,eax
not edx
and eax,[ebp+8]
and edx,[ebp+12]
or eax,edx
stosd
loop ctblp
mov ax,FONTSEL ; ANK Font Selecter
mov fs,ax
mov esi,3D800h
mov edi,offset ankfnt
mov ecx,16*256 ; ANK bit pattn gen
aktb1: movzx eax,byte ptr fs:[esi]
inc esi
mov eax,[eax*4+fntcol]
stosd
loop aktb1
pop fs
pop edi
pop esi
pop ebp
ret
ctblset endp
;**************************************************************
;
; 任意のCRTCレジスタに任意のワ-ド値を設定する
;
;void vram_offset(reg,ofs)
;int reg; [ebp+8] CRTCレジスタNo.
;int ofs; [ebp+12] 設定値
;**************************************************************
public vram_offset
vram_offset proc near
push ebp
mov ebp,esp
push edx
mov al,[ebp+8] ; CRTCレジスタNo.を
mov dx,0440h ;
out dx,al ; 書き込み
mov eax,[ebp+12] ; 設定値を
mov dx,0442h ;
out dx,ax ; 書き込む
pop edx
pop ebp
ret
vram_offset endp
public sjistojis
sjistojis proc near
movzx eax,word ptr [esp+4]
shl ah,1 ; Shift Jis to Jis
cmp al,080h
adc ax,1f61h
add al,7fh
jc short sjis1
add al,0a2h
sjis1: and ah,7fh ; StoJ end
ret
sjistojis endp
public peek
peek proc near
push edx
sub eax,eax
mov dx,[esp+8]
in al,dx
pop edx
ret
peek endp
pmcode ends
;*************************************
; protect code segment defs end
;*************************************
end